//
// Created by 13562 on 2023/6/23.
//

#ifndef CLEVELINGADJUST_H
#define CLEVELINGADJUST_H

#include <set>
#include "fstream"
#include "sstream"
#include "vector"
#include "Segment.h"
#include "Eigen/Core"
#include "Eigen/Dense"
using namespace std;
using namespace Eigen;

class CLevelingAdjust {
public:
	CLevelingAdjust();
	virtual ~CLevelingAdjust();

	int m_LNumber = 0;						// 高差总数
	int m_PNumber = 0;						// 总点数
	int m_knNumber = 0;						// 已知点数
	int m_stablePNumber;					// 拟稳点数
	ofstream resultFS;						// 文件流，输出计算结果
	double m_sigma;							// 先验单位权中误差
	double alpha;							// 显著水平

	vector<Segment> segments;				// 测段

	map<pair<string, string>, unsigned int> heightMap; // 高差序号映射
	vector<unsigned int> startPoints;		// 高差起点号(按高差序号索引)
	vector<unsigned int> endPoints;			// 高差终点号(按高差序号索引)
	Matrix<double, Dynamic, 1> L;			// 观测高差数组(按高差序号索引)
	Matrix<double, Dynamic, Dynamic> P;		// 观测值权阵(按高差序号索引)
	VectorXd V;								// 高差改正数向量(按高差序号索引)
	Matrix<double, Dynamic, Dynamic> QLL;	// 高差平差值协因数阵

	map<string, unsigned int> pointMap;		// 点号映射
	vector<bool> knownFlags;				// 已知点标记(按点号索引)
	Matrix<double, Dynamic, 1> Hts;			// 高程值数组(按点号索引)

	map<unsigned int, unsigned int> paraMap;// 参数点号映射
	VectorXd X;								// 高程平差值向量(按参数点号索引)
	Matrix<double, Dynamic, Dynamic> Qxx; 	// 参数平差值协因数阵

	VectorXd x;								// 高程改正数向量(按参数点号索引)
	double m_mu;							// 后验单位权中误差

	int *isStable;						// 拟稳点号标志数组

	// 输入原始数据
	void inputData(const string& knownPointFile, const string& observationDataFile);

	void calcApproxHeight();				// 计算近似高程
	void adjust();							// 平差
	void report(const string& reportFile);	// 结果输出

	void quasiStable(char *file);			// 拟稳平差
	void freeNetAdjust();					// 自由网平差
	void findShortPath(						// 最短路线搜索
			int p,
			int exclude,
			int neighbour[],
			double diff[],
			double S[]
			);
	void lineClosure(); 					// 计算路线闭合差
	void loopClosure();						// 计算环闭合差

	void dataSnooping(double arfa);			// 粗差探测

	void printPointMap();
	void printParaMap();
	void printApproxHeights();
	void printHeightMap();
};


#endif //CLEVELINGADJUST_H
